#include "Input.h";
#include "onafhankelijkeData.h";

//geeft de pointer naar de input terug
mailBox* GiveInput(sensor *sens)
{
	return &(*sens).sensorInput; //deze methode geeft een pointer terug naar de mailbox waarin input terech kan komen
}

//initialiseert de gegeven sensor
void sensorInit(sensor *sens)
{
	/*
	maakt alle variabelen die nodig zijn voor de sensor draaiende te houden
	*/
	(*sens).taak = (task*)malloc(sizeof(task));
	create_mailBox((&(*sens).sensorInput), 1, sizeof(SensorInvoer));
	create_mailBox((&(*sens).sensorOutput), 1, sizeof(SensorUitvoer));
	create_event((&(*sens).dataOpInvoer), 0); 
	
	/*
	alle variabelen van de input kunnen op 0 gezet worden omdat het systeem ten alle tijden meekijkt
	dat betekent dat er als er een pedaal wordt ingeduwt het systeem dit altijd registreert, het is alleen
	dat er niets mee gedaan wordt zolang het systeem niet op actief is gezet.
	Verder is dit niet 'schadelijk' omdat het gaat om een verschil ten opzicht van een eerdere situatie, en 
	deze situatie wordt dus altijd geregistreerd.
	*/
	(*sens).gasOud = 0;
	(*sens).remOud = 0;
	(*sens).koppelingOud = 0;
}

//start de taak van een specifieke sensor
unsigned __stdcall inputStart(void* arg){
	task* t = (task*) arg; //haal de taak op
	SensorInvoer invoer; //variabele voor het uitlezen van de invoer
	SensorUitvoer uitvoer;
	sensor *sens = (sensor *)getArgument_task(t); //haal de parameter op
	while(!isTerminated_task(t)){ //zolang de taak loopt moet het volgende worden gedaan
		
		get_mailBox(&((*sens).sensorInput), &invoer); //de plaats waar de data moet komen
		
		uitvoer.snelheid = invoer.snelheid;//geef de snelheid door aan de output van de sensor


		if(((*sens).gasOud-invoer.gas) < 0 ||((*sens).remOud-invoer.rem) < 0 || ((*sens).koppelingOud-invoer.koppeling) < 0)
		{
			uitvoer.actie = PedaalIndrukken;
		}
		else
		{
			//voor iedere knop die wordt ingedrukt moet een ander signaal
			//worden gegeven aan sout.Actie
			switch(invoer.knoppen)
			{
			case (AanuitKnop):
				uitvoer.actie = activatieknopIndrukken;
				break;
			case(VersnellenKnop):
				uitvoer.actie = Snelheidverhogen;
				break;
			case(VertragenKnop):
				uitvoer.actie = Snelheidverlagen;
				break;
			case(PauzeKnop):
				uitvoer.actie = Pauzeren;
				break;
			default:
				uitvoer.actie = SnelheidControleren;
			}
		
			
		}
		(*sens).uitdata.actie = uitvoer.actie;
		(*sens).uitdata.snelheid = uitvoer.snelheid;
		
		/*
		als de mailbox nog een bericht heeft mag dit nieuwe signaal niet worden doorgegeven
		anders zou zich een situatie kunnen voordoen waarin het systeem vast loopt omdat
		het geen mail meer kan posten.
		Om er toch voor te zorgen dat nieuwe waarden van de invoer in verdere situaties goed worden
		doorgegeven worden dan ook geen nieuwe waardes in gasOud enz. gezet.
		*/
		if(isEmpty_mailBox(&((*sens).sensorOutput))==1){
			put_mailBox(&((*sens).sensorOutput), &(*sens).uitdata); 
			pulse_event((&(*sens).dataOpInvoer));	//het event dat er actuele data op de output staat wordt gegeven
			//de situatie van nu is de referentie voor de situatie van dadelijk
			(*sens).gasOud = invoer.gas;
			(*sens).remOud = invoer.rem;
			(*sens).koppelingOud = invoer.koppeling;
		}


	}
	return 0;
}

//ruimt een sensor op
void sensorDelete(sensor *sens)
{
	delete((*sens).taak);	//stopt de taak en verwijdert deze
	delete_mailBox(&((*sens).sensorInput)); //verwijdert de mailbox
	delete_mailBox(&((*sens).sensorOutput));
	delete_event(&((*sens).dataOpInvoer)); //verwijdert het event
}